package com.losrebellos.project.media.player.stream {	import com.losrebellos.constants.states.NetStatusState;	import com.losrebellos.events.NetStreamClientEvent;	import com.losrebellos.net.MetaData;	import com.losrebellos.net.NetStreamClient;	import flash.events.AsyncErrorEvent;	import flash.events.Event;	import flash.events.NetStatusEvent;	import flash.media.SoundTransform;	import flash.net.NetConnection;	import flash.net.NetStream;	/*	 *	 * @author los rebellos	 *	 */	public final class VideoStream extends Stream implements IStream	{		////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		// VARIABLES
		////////////////////////////////////////////////////////////////////////////////////////////////////////////////		protected var _connection:NetConnection;		protected var _client:NetStreamClient;		public var stream:NetStream;				////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		// CONSTRUCTOR
		////////////////////////////////////////////////////////////////////////////////////////////////////////////////		public function VideoStream(id:String, src:String, loop:int = 1, minBuffer:Number = 0)		{			super(id, src, loop, minBuffer);		}						////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		// STREAM
		////////////////////////////////////////////////////////////////////////////////////////////////////////////////		override protected function createStream():void		{			_connection = new NetConnection;			_connection.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);			_connection.connect(null);						_client = new NetStreamClient;			_client.addEventListener(NetStreamClientEvent.META_DATA, metaDataHandler);						_stream = stream = new NetStream(_connection);			stream.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);			stream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, onAsyncError);			stream.client = _client;		}						////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		// SOUND TRANSFORM
		////////////////////////////////////////////////////////////////////////////////////////////////////////////////		override public function set soundTransform(value:SoundTransform):void		{			stream.soundTransform = value;		}		override public function get soundTransform():SoundTransform		{			return stream.soundTransform;		}		
				////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		// DATA
		////////////////////////////////////////////////////////////////////////////////////////////////////////////////		override public function getPercentLoaded():Number		{			return stream.bytesLoaded / stream.bytesTotal;		}		override public function getPercentPlayed():Number		{			if(_client && _client.metaData.duration)			{				return stream.time / _client.metaData.duration;			}						return 0;		}				////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		// LOAD
		////////////////////////////////////////////////////////////////////////////////////////////////////////////////		override public function load():void		{			super.load();						stream.play(_src);			stream.pause();						PROGRESS.addEventListener(Event.ENTER_FRAME, onProgress);		}						////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		// CONTROLS
		////////////////////////////////////////////////////////////////////////////////////////////////////////////////		override public function play(percent:Number = 0, loop:int = 1):void		{			super.play(percent, loop);						stream.seek(_percent * _client.metaData.duration);			stream.resume();		}		override public function resume():void		{			super.resume();						stream.resume();		}		override public function pause():void		{			super.pause();						stream.pause();		}		override public function stop():void		{			super.stop();						stream.pause();			stream.close();		}		override public function seek(percent:Number):void		{			super.seek(percent);						stream.seek(_percent * _client.metaData.duration);		}						////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		// NET STATUS
		////////////////////////////////////////////////////////////////////////////////////////////////////////////////		protected function onProgress(e:Event):void		{			streamProgress();			streamReady();						if(this.getPercentLoaded() >= 1)			{				PROGRESS.removeEventListener(Event.ENTER_FRAME, onProgress);				streamLoaded();			}		}		protected function onNetStatus(e:NetStatusEvent):void		{			switch(e.info["code"])			{				case NetStatusState.PLAY_STREAM_NOT_FOUND:					streamNotFound();					break;								case NetStatusState.PLAY_START:					streamStart();					break;								case NetStatusState.PLAY_STOP:					streamComplete();					break;								case NetStatusState.PAUSE:					streamPaused();					break;								case NetStatusState.UNPAUSE:					streamResume();					break;								case NetStatusState.BUFFER_EMPTY:					streamBufferEmpty();					break;								case NetStatusState.BUFFER_FULL:					streamBufferFull();					break;			}		}						////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		// ASYNC ERROR
		////////////////////////////////////////////////////////////////////////////////////////////////////////////////		protected function onAsyncError(e:AsyncErrorEvent):void		{			streamError(e);		}				////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		// METADATA
		////////////////////////////////////////////////////////////////////////////////////////////////////////////////		protected function metaDataHandler(e:NetStreamClientEvent):void		{			_client.removeEventListener(NetStreamClientEvent.META_DATA, metaDataHandler);						streamInitialized();		}		public function getNetStreamClient():NetStreamClient		{			return _client;		}		public function getMetadata():MetaData		{			return _client.metaData;		}						////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		// DISPOSE
		////////////////////////////////////////////////////////////////////////////////////////////////////////////////		override public function dispose(e:Event = null):void		{			if(PROGRESS.hasEventListener(Event.ENTER_FRAME))			{				PROGRESS.removeEventListener(Event.ENTER_FRAME, onProgress);			}						stream.pause();			stream.close();			stream = null;						super.dispose(e);		}	}}